# 阶段1：构建 Next.js 产物（基于 Node 镜像，仅用于构建，不包含在最终镜像）
FROM node:20-alpine AS builder
WORKDIR /app
# 复制依赖配置文件（先复制 package.json 可利用 Docker 缓存，依赖不变时无需重新安装）
COPY package*.json ./
# 安装依赖（含开发依赖，用于构建）
RUN npm config set registry https://registry.npmmirror.com && npm install --no-audit
# 复制项目所有代码
COPY . .
# 构建 Next.js 产物（生成 .next 目录）
RUN npm run build

# 阶段2：生产环境运行（基于轻量 Node 镜像，仅包含运行时依赖，减小镜像体积）
FROM node:20-alpine
WORKDIR /app
# 从构建阶段复制必要的产物（仅复制运行所需文件，减小镜像体积）
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/package*.json ./
# 安装生产依赖（仅保留运行时必需依赖，不含开发依赖）
RUN npm config set registry https://registry.npmmirror.com && npm install --production --no-audit
# 暴露容器内端口（与 Next.js 启动端口一致，后续映射到宿主机）
EXPOSE 3000
# 启动 Next.js 服务（固定容器内端口为 3000，宿主机端口可动态映射）
CMD ["npm", "start", "--", "-p", "3000"]